// 小U正在探访一座农场，农场的果树排成一列，用整数数组 fruits 表示，每个元素 fruits[i] 是第 i 棵树上的水果种类。

// 小U有两个篮子，每个篮子只能装一种类型的水果，而且每个篮子可以装无限量的水果。
// 小U从任意一棵树开始，必须从每棵树上恰好采摘一个水果，并且只能装入符合篮子中水果类型的果实。
// 如果某棵树上的水果类型不符合篮子中的水果类型，则必须停止采摘。

// 请你帮助小U计算他最多可以采摘多少个水果。

// 例如：当 fruits = [1,2,3,2,2] 时，小U最多可以采摘的树是从第2棵开始，采摘到最后的 4 棵树，结果为 [2,3,2,2]。

/**
 * 为了解决这个问题，使用滑动窗口的方法
 * 维护一个窗口，这个窗口内的水果种类最多只能有两种
 * 并且要尽可能扩大这个窗口，以使得窗口内的水果数量最多
 * @param {*} fruits
 * @returns
 */
function solution(fruits) {
  let left = 0; // 窗口的左边界
  let right = 0; // 窗口的右边界
  let fruitCount = {}; // 记录当前窗口内每种水果的数量
  let maxFruits = 0; // 记录能够采摘的最大水果数量
  // 遍历数组，同时更新窗口内的水果种类和数量
  while (right < fruits.length) {
    // 添加当前水果到哈希表中
    if (!fruitCount[fruits[right]]) {
      fruitCount[fruits[right]] = 0;
    }
    fruitCount[fruits[right]]++;

    // 如果窗口内的水果种类超过两种，需要收缩窗口
    while (Object.keys(fruitCount).length > 2) {
      fruitCount[fruits[left]]--;
      if (fruitCount[fruits[left]] === 0) {
        delete fruitCount[fruits[left]];
      }
      left++;
    }

    // 更新最大水果数量
    maxFruits = Math.max(maxFruits, right - left + 1);

    // 移动右边界
    right++;
  }

  return maxFruits;
}

function main() {
  console.log(solution([1, 2, 1, 2]) === 4); // true
  console.log(solution([2, 0, 1, 2, 2]) === 3); // true
  console.log(solution([1, 1, 2, 3, 1, 2, 3, 2, 3, 1, 3, 2, 4]) === 4); // true
}

main();
